package _map

// From 从单个slice构建map,从值中获取键
func From[K comparable, V any](list []V, key func(V) K) map[K]V {
	res := map[K]V{}
	for _, v := range list {
		k := key(v)
		res[k] = v
	}
	return res
}

// Make 使用两个slice组装map，一个提供键，一个提供值，如果两边长度不一致，只能按照较短的组装
func Make[K comparable, V any](ks []K, vs []V) map[K]V {
	res := map[K]V{}
	num := len(ks)
	if _num := len(vs); _num < num {
		num = _num
	}
	for i := 0; i < num; i++ {
		res[ks[i]] = vs[i]
	}
	return res
}

// Keys 获取所有键
func Keys[K comparable, V any](m map[K]V) (res []K) {
	for id := range m {
		res = append(res, id)
	}
	return res
}

// Values 获取所有值
func Values[K comparable, V any](m map[K]V) (res []V) {
	for _, v := range m {
		res = append(res, v)
	}
	return res
}

// Sub 获取子map
func Sub[K comparable, V any](m map[K]V, ks []K) map[K]V {
	res := map[K]V{}
	for _, k := range ks {
		if v, has := m[k]; has {
			res[k] = v
		}
	}
	return res
}
